EC2にNode.jsをインストールして、ExpressでAPIサーバを作ってみた

EC2にNode.jsをインストールして、ExpressでAPIサーバを作ってみた

Clock Icon2024.08.22

こんにちは、ゲームソリューション部のsoraです。
今回は、EC2にNode.jsをインストールして、ExpressでAPIサーバを作ってみたことについて書いていきます。
今回使用するAMIはAmazon Linux2023です。

Node.jsのインストール

まずはNode.jsをインストールします。

sudo dnf update -y
sudo dnf install -y gcc-c++ make
curl -sL https://rpm.nodesource.com/setup_20.x | sudo -E bash -
sudo dnf install -y nodejs

# インストール確認
node --version
v20.17.0

Expressのインストール

次にExpressをインストールします。
プロジェクト初期化時に、デフォルトの場合はindex.jsですが、index.mjsに設定しています。
プロジェクト初期化をすることで、package.jsonが生成されます。

# ディレクトリ作成
mkdir myexpressapi && cd myexpressapi

# プロジェクトの初期化
npm init
# entry pointだけ入力しました。
package name: (myexpressapi)
version: (1.0.0)
description:
entry point: (index.js) index.mjs
test command:
git repository:
keywords:
author:
license: (ISC)

# Expressのインストール
npm install express

サーバの起動・動作確認

インストールなどの準備が終わったため、実際のコードを書いていきます。
コードの説明はコメントアウトして記載しています。

index.mjs
// expressのインポート
import express from 'express';

// expressインスタンスの作成(サーバ設定やルーティングのために必要)
const app = express();

// app.getは、GETリクエストに対するルートハンドラ
// /apiにアクセスがあったときに実行される
// getのほかにもpostやdeleteなど、それぞれのメソッドに対応したものがある
app.get('/api', (req, res) => {
    res.json({ message: 'Hello, World!' });
});

// app.useは、全てのメソッドに対する処理(今回は404エラーハンドリング)
// パスを指定しない場合は、どのルートにもマッチしなかった場合に実行される
// getやuseの条件に複数当てはまる場合は、上から実行されていきnext();があれば実行後に次の処理に移動する
// 前の処理でレスポンスが返されていたり、next();が書いてない場合は、以降が実行されない
app.use((req, res, next) => {
    res.status(404).json({ message: 'Not Found' });
});

// サーバの起動、リッスンポートの設定
app.listen(80, () => {
    console.log('Server is running on port 80');
});

コードを実行して、APIサーバを起動します。

node index.mjs

今回のようにリッスンポートを80にした場合は、上記のコマンドでは特権ポートでの実行となるため、管理者権限が必要とのエラーが出ました。
ポートを変えるか、管理者として実行することで実行可能です。

sudo node index.mjs
Server is running on port 80

指定したポートとパスで実行すると、app.getで処理している{ message: 'Hello, World!' }が表示されました。
sr-ec2-nodejs-express-api

最後に

今回は、EC2にNode.jsをインストールして、ExpressでAPIサーバを作ってみたことを記事にしました。
どなたかの参考になると幸いです。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.